using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.Collections;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour, ISaveManager
{
    [Header("死亡Screen")]
    [SerializeField] private GameObject endText;
    [SerializeField] private UI_FadeScreen fadeScreen;
    [SerializeField] private GameObject restartButton;
    [Space]

    // 序列化字段，私有变量，用于存储不同的UI面板
    [SerializeField] private GameObject characterUI;
    [SerializeField] private GameObject skillTreeUI;
    [SerializeField] private GameObject craftUI;
    [SerializeField] private GameObject optionsUI;
    [SerializeField] private GameObject InGameUI;

    // 公共变量，用于存储不同的UI提示窗口
    public UI_SkillToopTip skillToopTip;
    public UI_ItemToolTip itemToolTip;
    public UI_StatToolTip statToolTip;
    public UI_CraftWindow craftWindow;

    [SerializeField] private Ul_VolumeSlider[] volumeSettings;

    private void Awake()
    {
        SwitchTo(skillTreeUI);// 激活技能树绑定按键功能，其实可以手动在unity给按键绑定方法
        fadeScreen.gameObject.SetActive(true);
    }

    void Start()
    {
        // itemToolTip = GetComponentInChildren<UI_ItemToolTip>();//实例化比UI慢获取不到
        // 切换到初始UI面板（无）
        SwitchTo(InGameUI);
        // 隐藏itemToolTip和statToolTip
        itemToolTip.gameObject.SetActive(false);
        statToolTip.gameObject.SetActive(false);
    }

    // 每帧更新一次
    void Update()
    {
        // 按下C键时切换到characterUI
        if (Input.GetKeyDown(KeyCode.C))
        {
            SwitchWithKeyTo(characterUI);
        }
        // 按下V键时切换到craftUI
        if (Input.GetKeyDown(KeyCode.V))
        {
            SwitchWithKeyTo(craftUI);
        }
        // 按下B键时切换到skillTreeUI
        if (Input.GetKeyDown(KeyCode.B))
        {
            SwitchWithKeyTo(skillTreeUI);
        }
        // 按下N键时切换到optionsUI
        if (Input.GetKeyDown(KeyCode.N))
        {
            SwitchWithKeyTo(optionsUI);
        }
    }

    // 切换UI面板
    public void SwitchTo(GameObject _menu)
    {

        // 遍历所有子对象并隐藏
        for (int i = 0; i < transform.childCount; i++)
        {
            // 检查子对象是否有 UI_FadeScreen 组件
            bool FadeScreen = transform.GetChild(i).GetComponent<UI_FadeScreen>() != null;

            // 如果没有 UI_FadeScreen 组件，则隐藏子对象
            if (FadeScreen == false)
                transform.GetChild(i).gameObject.SetActive(false);
        }
        // 如果 _menu 不为空，则显示 _menu
        if (_menu)
        {
            _menu.SetActive(true);
        }
        // 需要调整脚本顺序 AudioManager > UI
        AudioManager.instance?.PlaySFX(7, null);//有bug，死亡后重新加载打不开面板了

        // 静止游戏
        if (GameManager.instance != null)
        {
            if (_menu == InGameUI)
            {
                GameManager.instance.PauseGame(false);
            }
            else
            {
                GameManager.instance.PauseGame(true);
            }
        }

    }

    // 使用按键切换UI面板
    public void SwitchWithKeyTo(GameObject _menu)
    {
        // 如果_menu不为空且已激活，则隐藏_menu
        if (_menu != null && _menu.activeSelf)
        {
            _menu.SetActive(false);
            // CheckForInGameUI();//可以直接替换下面这句
            SwitchTo(InGameUI);
            return;
        }
        // 否则切换到_menu
        SwitchTo(_menu);
    }

    // 切换正在游戏中的UI
    private void CheckForInGameUI()
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            if (transform.GetChild(i).gameObject.activeSelf && transform.GetChild(i).GetComponent<UI_FadeScreen>() == null)
            {
                return;
            }
        }
        SwitchTo(InGameUI);
    }

    // 游戏结束界面
    public void SwitchOnEndScreen()
    {
        // SwitchTo(null);
        fadeScreen.FadeOut();

        StartCoroutine(EndScreenCorutione());

    }

    // 显示游戏结束字体，用定时器也行
    IEnumerator EndScreenCorutione()
    {
        yield return new WaitForSeconds(1.5f);
        endText.SetActive(true);
        yield return new WaitForSeconds(1.5f);
        restartButton.SetActive(true);
    }

    // 死亡后再次游戏
    public void RestartGameButton() => GameManager.instance.RestartScene();

    public void LoadData(GameData _data)
    {
        // 加载音量设置
        foreach (KeyValuePair<string, float> pair in _data.volumeSettings)
        {
            foreach (Ul_VolumeSlider item in volumeSettings)
            {
                if (item.parametr == pair.Key)
                {
                    item.Loadslider(pair.Value);
                }
            }
        }
    }

    public void SaveData(ref GameData _data)
    {
        // 保存音量设置
        _data.volumeSettings.Clear();
        foreach (Ul_VolumeSlider item in volumeSettings)
        {
            _data.volumeSettings.Add(item.parametr, item.slider.value);
        }
    }
}